﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WC.DL.DALC.IF;
using WC.BL.BE;
using System.Data;
using System.Data.SqlClient;

namespace WC.DL.DALC.MSSQL
{
    public class MensajeDALC: IMensajeDALC
    {
        #region Singleton
        public static MensajeDALC Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (typeof(MensajeDALC))
                    {
                        if (_instance == null)
                        {
                            _instance = new MensajeDALC();
                        }
                    }
                }
                return _instance;
            }
        }

        private MensajeDALC() { }
        private static volatile MensajeDALC _instance = null;
        #endregion


        #region IMensajeDALC Members

        public List<MensajeBE> read(MensajeBE pObjMensajeBE)
        {
            DateTime fi = DateTime.Parse( pObjMensajeBE.Fechai);
            DateTime ff = DateTime.Parse(pObjMensajeBE.Fechaf);
            
            List<MensajeBE> lst = new List<MensajeBE>(); ;
            DataSet ds = SqlHelper.ExecuteDataset(DALC.ConnStr, "usps_mensajes", pObjMensajeBE.Titulo,
                                                  fi.Month + "/" + fi.Day + "/" + fi.Year,
                                                  ff.Month + "/" + ff.Day + "/" + ff.Year,
                                                  pObjMensajeBE.Mensaje_id);
            DataTable dt = ds.Tables[0];
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                MensajeBE m = new MensajeBE();
                m.Mensaje_id =(int) dt.Rows[i]["mensaje_id"];
                m.Mensaje = dt.Rows[i]["mensaje"].ToString();
                m.Titulo = dt.Rows[i]["titulo"].ToString();
                m.Fechai = (DateTime.Parse(dt.Rows[i]["fechai"].ToString())).ToShortDateString();
                m.Fechaf = (DateTime.Parse(dt.Rows[i]["fechaf"].ToString())).ToShortDateString();
                lst.Add(m);
            }
            return lst;
        }

        public List<GenericBE> read()
        {
            List<GenericBE> lst = new List<GenericBE>(); 
            DataSet ds = SqlHelper.ExecuteDataset(DALC.ConnStr, "usps_mensajes", DBNull.Value,
                                                  DBNull.Value, DateTime.Now.Month + "/" + DateTime.Now.Day + "/" + DateTime.Now.Year,
                                                  0);
            DataTable dt = ds.Tables[0];
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                GenericBE m = new GenericBE();
                m.Codigo = dt.Rows[i]["mensaje_id"].ToString();
                m.Descripcion = dt.Rows[i]["titulo"].ToString();
                lst.Add(m);
            }
            return lst;
        }

        public MensajeBE read(int id)
        {
            MensajeBE m = new MensajeBE();
            DataSet ds = SqlHelper.ExecuteDataset(DALC.ConnStr, "usps_mensajes", string.Empty,
                                                  string.Empty, string.Empty,
                                                  id);
            DataTable dt = ds.Tables[0];
            for (int i = 0; i < dt.Rows.Count; i++)
            {                
                m.Mensaje_id = (int)dt.Rows[i]["mensaje_id"];
                m.Mensaje = dt.Rows[i]["mensaje"].ToString();
                m.Titulo = dt.Rows[i]["titulo"].ToString();
                m.Fechai = (DateTime.Parse(dt.Rows[i]["fechai"].ToString())).ToShortDateString();
                m.Fechaf = (DateTime.Parse(dt.Rows[i]["fechaf"].ToString())).ToShortDateString();
            }
            return m;
        }

        public string write(MensajeBE pObjMensajeBE)
        {
            int retpar = 1; string retval = string.Empty;
            DateTime fi = DateTime.Parse(pObjMensajeBE.Fechai);
            DateTime ff = DateTime.Parse(pObjMensajeBE.Fechaf);
            
            if (pObjMensajeBE != null)
            {
                retpar = SqlHelper.ExecuteNonQuery(DALC.ConnStr, "uspi_mensajes",
                                                   pObjMensajeBE.Titulo,
                                                   pObjMensajeBE.Mensaje,
                                                  fi.Month + "/" + fi.Day + "/" + fi.Year ,
                                                  ff.Month + "/" + ff.Day + "/" + ff.Year);
                if (retpar != 1)
                {
                    retval = "No se creó el mensaje. Comuniquese con el administrador del sistema.";
                }
                else
                {
                    retval = "El registro se realizó con Éxito";
                }
            }
            return retval;
        }

        public string update(MensajeBE pObjMensajeBE)
        {
            int retpar = 1; string retval = string.Empty;
            if (pObjMensajeBE != null)
            {
                retpar = SqlHelper.ExecuteNonQuery(DALC.ConnStr, "uspu_mensajes",
                                                   pObjMensajeBE.Titulo, pObjMensajeBE.Mensaje, pObjMensajeBE.Fechai,
                                                   pObjMensajeBE.Fechaf, pObjMensajeBE.Mensaje_id);
                if (retpar != 1)
                {
                    retval = "No se modificó el mensaje. Comuniquese con el administrador del sistema.";
                }
                else
                {
                    retval = "El mensaje se actualizó Éxito";
                }
            }
            return retval;
        }

        public string asignarMensaje(List<GenericBE> pUsuarios, int pMensaje_Id)
        {
            string rpta;
            SqlConnection conBD =null;
            SqlCommand cmd =  new SqlCommand();
                
            try
            {
                conBD = new SqlConnection(DALC.ConnStr);
                cmd.Connection = conBD;
                conBD.Open();
                cmd.Transaction = conBD.BeginTransaction();
                // elimino todas las asignaciones de mensajes dependiendo del id del mansaje
                cmd.CommandText = "dbo.uspd_eliminar_asig_msj";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@mensaje_id", SqlDbType.Int);
                cmd.Parameters["@mensaje_id"].Value = pMensaje_Id;

                if ((int)cmd.ExecuteNonQuery() < 0)
                {
                    cmd.Transaction.Rollback();
                    rpta = "Ocurrio un error al momento de asignar el mesaje.";
                    return rpta;
                }


                // se asignan los mensajes a los usuarios

                cmd.CommandText = "dbo.uspi_asignar_mensajes";
                foreach (GenericBE itm in pUsuarios)
                {
                    cmd.Parameters.Clear();
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add("@mensaje_id", SqlDbType.Int);
                    cmd.Parameters["@mensaje_id"].Value = pMensaje_Id;

                    cmd.Parameters.Add("@usuario", SqlDbType.VarChar);
                    cmd.Parameters["@usuario"].Value = itm.Codigo;

                    if ((int)cmd.ExecuteNonQuery() < 0)
                    {
                        cmd.Transaction.Rollback();
                        rpta = "Ocurrio un error al momento de asignar el mesaje.";
                        return rpta;
                    }
                }
                 
                // si no apareció ningun problema se realiza el commit
                cmd.Transaction.Commit();
                rpta = "Se asignó el mensaje a los clientes seleccionados";
                return rpta;

            }
            catch (Exception ex)
            {
                return ex.Message.ToUpper();
            }
            finally
            {
                cmd.Dispose();
                cmd = null;
                conBD.Close();
                conBD = null;
            }
        }

        public List<MensajeBE> muestrMensajesXusuario(string pUsua)
        {
            List<MensajeBE> lstm = new List<MensajeBE>();
            DataSet ds = SqlHelper.ExecuteDataset(DALC.ConnStr, "usps_mensajesXusuario",pUsua);
            DataTable dt = ds.Tables[0];
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                MensajeBE m = new MensajeBE();
                m.Mensaje = dt.Rows[i]["mensaje"].ToString();
                m.Titulo = dt.Rows[i]["titulo"].ToString();
                m.Fechai = (DateTime.Parse(dt.Rows[i]["fechai"].ToString())).ToShortDateString();
                m.Fechaf = (DateTime.Parse(dt.Rows[i]["fechaf"].ToString())).ToShortDateString();
                lstm.Add(m);
            }
            return lstm;
        }
        #endregion
    }
}
